package com.spring.boot.quartz.service;

import org.quartz.Job;
import org.quartz.JobKey;
import org.quartz.SchedulerException;
import org.quartz.impl.matchers.GroupMatcher;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 定时任务相关接口
 *
 * @author LiKun
 * @date 2021/7/30 17:01
 */
public interface QuartzService {
    /**
     * 暂停全部的任务
     *
     * @throws SchedulerException 任务相关异常
     */
    void pauseAllJob() throws SchedulerException;

    /**
     * 恢复全部暂停的任务
     *
     * @throws SchedulerException 任务相关异常
     */
    void resumeAllJob() throws SchedulerException;

    /**
     * 暂停指定的任务
     *
     * @param jobKey 任务标识
     *
     * @throws SchedulerException 任务相关异常
     */
    void pauseJob(JobKey jobKey) throws SchedulerException;

    /**
     * 回复指定的任务
     *
     * @param jobKey 任务标识
     *
     * @throws SchedulerException 任务相关异常
     */
    void resumeJob(JobKey jobKey) throws SchedulerException;

    /**
     * 删除定时任务
     *
     * @param jobKey 任务标识
     *
     * @throws SchedulerException 任务绑定异常
     */
    void deleteJob(JobKey jobKey) throws SchedulerException;

    /**
     * 立即执行任务组
     *
     * @param jobKey 任务表示
     *
     * @throws SchedulerException 任务执行异常
     */
    void triggerJob(JobKey jobKey) throws SchedulerException;

    /**
     * 查询全部定时任务
     *
     * @return 查询结果
     *
     * @throws SchedulerException 任务异常
     */
    List<Map<String, String>> queryAllJob() throws SchedulerException;

    /**
     * 查询正在执行的定时任务
     *
     * @return 查询结果
     *
     * @throws SchedulerException 任务异常
     */
    List<Map<String, String>> queryRunJob() throws SchedulerException;

    /**
     * 暂停指定的任务组
     *
     * @param groupMatcher 任务组标识匹配
     *
     * @throws SchedulerException 任务相关异常
     */
    void pauseJobs(GroupMatcher<JobKey> groupMatcher) throws SchedulerException;

    /**
     * 恢复指定的任务组
     *
     * @param groupMatcher 任务组标识匹配
     *
     * @throws SchedulerException 任务相关异常
     */
    void resumeJobs(GroupMatcher<JobKey> groupMatcher) throws SchedulerException;

    /**
     * 立即执行任务组
     *
     * @param jobKey  任务表示
     * @param jobData 交换的数据
     *
     * @throws SchedulerException 任务执行异常
     */
    void triggerJob(JobKey jobKey, Map<String, Object> jobData) throws SchedulerException;

    /**
     * 修改定时任务的执行时间
     *
     * @param jobClass 定时任务执行逻辑
     * @param name     任务名称
     * @param group    任务组名称
     * @param cron     执行时间表达式
     * @param date     任务开始时间
     * @param jobData  相关map数据
     *
     * @throws SchedulerException 任务绑定异常
     */
    void updateJob(Class<? extends Job> jobClass, String name, String group, String cron, Date date, Map<String, Object> jobData) throws SchedulerException;

    /**
     * 新建定时任务并持久化
     *
     * @param jobClass 定时任务执行逻辑
     * @param name     任务名称
     * @param group    任务组名称
     * @param cron     执行时间表达式
     * @param date     任务开始时间
     * @param jobData  相关map数据
     *
     * @throws SchedulerException 任务绑定异常
     */
    void addJob(Class<? extends Job> jobClass, String name, String group, String cron, Date date, Map<String, Object> jobData) throws SchedulerException;
}
